/*
	This file is part of AVRCppLib.

    AVRCppLib is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    AVRCppLib is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with AVRCppLib.  If not, see <http://www.gnu.org/licenses/>.

    Copyright (C) Maxime Lemonnier 2007-2011
 */

#ifndef LIST_H_
#define LIST_H_

#include "../Utils/CppExtensions.h"
#include "Node.h"
#include "LinkedListIterator.h"


template <typename ElementType>
class List {
public:

	typedef LinkedListIterator<ElementType> ListIterator;

	List();

	List(const List& rhs);

	virtual ~List();

	bool append(const ElementType & element);

	bool insertElement(const ElementType & element, size_t position);

	bool remove(const ElementType & element);

	bool remove(size_t position);

	size_t numberOfElements() const;

	bool isEmpty() const;

	ElementType * element(size_t position) const;

	size_t position(const ElementType & element) const;

	List<ElementType>& operator = (const List<ElementType>& rhs);

	ListIterator elements() const;

private:
	typedef Node<ElementType> ListNode;

	Node<ElementType> * nodeAt(size_t position) const;

	void removeAllNodes();

	ListNode * begin;

	size_t size;
};

#include "List-definitions.h"



#endif
